package epoch.game.core.server;

import java.net.SocketAddress;

/**
 * 玩家会话Session
 * 
 * @author will
 *
 */
public interface ISession {
	
	/**
	 * 获取会话id
	 * @return
	 */
	long getId();
	
	/**
	 * 获取会话状态
	 * @return
	 */
	int getState();
	
	/**
	 * 设置会话状态
	 * @param state
	 */
	void setState(int state);
	
	/**
	 * 向客户端发消息, 没有encoder，实现需要总是写入IoBuffer
	 * @param message
	 */
	void write(Object message);

	/**
	 * 写入字节数组
	 * @param bytes
	 */
	void write(byte[] bytes);
	
	/**
	 * 获取客户端地址
	 * @return
	 */
	SocketAddress remoteAddress();
	
	/**
	 * 获取客户端ip地址
	 * @return
	 */
	String remoteIP();
	
	/**
	 * 设置会话参数
	 * @param key
	 * @param obj
	 */
	void setAttribute(String key,Object obj);
	
	/**
	 * 获取会话参数
	 * @param key
	 * @return
	 */
	<T> T getAttribute(String key);

	/**
	 * 判断是否包含指定参数
	 * @param key
	 * @return
	 */
	boolean containsAttribute(String key);
	
	/**
	 * 移出会话参数
	 * @param key
	 */
	void removeAttribute(String key);
	
	/**
	 * 关闭会话
	 */
	void close();
	
	/**
	 * 关闭会话
	 */
	void close(boolean force);
	
	/**
	 * 关闭会话
	 * @param force true表示丢弃未成功发送的消息，直接关闭socket
	 * @param delay 延迟毫秒数
	 */
	void close(boolean force, long delay);
	
	/**
	 * 会话是否还处于连接状态
	 * @return
	 */
	boolean isConnected();
	
	/**
	 * 待写入的内容长度
	 * @return
	 */
	long getScheduledWriteBytes();
	
	/**
	 * 缓存发送消息
	 * @param msg
	 */
	void writeToSendBuffer(byte[] msg, boolean needCopy);
	
	/**
	 * 发送缓存的消息
	 */
	int flushSendBuffer();

	/**
	 * 获取消息缓冲区大小
	 * @return
	 */
	long getSendBufferSize();

	/**
	 * 是否正在关闭中
	 * @return
	 */
	boolean isClosing();

	
}
